import { NestFactory } from '@nestjs/core';
import { ConfigService } from '@nestjs/config';
import { AppModule } from './app.module';
import useSwagger from './utils/useSwagger';
import { HttpExceptionFilter } from './core/filter/http-exception/http-exception.filter';
import { TransformInterceptor } from './core/interceptor/transform/transform.interceptor';
import { ValidationPipe } from '@nestjs/common';
//导入session
import * as session from 'express-session';
import { diskStoragePath, fileStoragePath } from './utils/constant';
//由于multer是express的插件，为了可以在NestJS中使用，需要导入NesrExpressApplication，这时express平台的应用接口
import { NestExpressApplication } from '@nestjs/platform-express';

async function bootstrap() {
  const app = await NestFactory.create<NestExpressApplication>(AppModule);
  // app.enableVersioning({
  //   type: VersioningType.URI,
  // });
  //注册使用
  app.use(session({ secret: 'Liks_files', name: 'x-session' }));

  //生成静态目录，通过useStaticAssets()来定义静态目录
  app.useStaticAssets(fileStoragePath, {
    //前缀名，意味着filePath文件夹下的资源，可以通过/diskStoragePath前缀访问，如
    //http://localhost:8088/diskStoragePath/文件名称
    prefix: `/${diskStoragePath}`,
  });
  const configService = app.get(ConfigService);
  // 获取配置参数
  const appConfig = configService.get('app');
  // 使用swagger接口文档
  useSwagger(app, appConfig);

  // 设置全局路由前缀
  app.setGlobalPrefix(appConfig.globalPrefix);

  // 注册全局拦截器
  app.useGlobalInterceptors(new TransformInterceptor());

  // 注册全局异常过滤器
  app.useGlobalFilters(new HttpExceptionFilter());

  // 全局启用 ValidationPipe 加上参数校验。
  // transform 指定为 true，这样会自动把参数的 js 对象转换为 dto 类型对象。
  app.useGlobalPipes(new ValidationPipe({ transform: true }));

  await app.listen(appConfig.port);
  return appConfig;
}
// 在服务器的部署路径 /var/opt/node-projects/minimart/dist
bootstrap().then((config) => {
  console.log('config:==>', config);
  const { host, port, swaggerPath, globalPrefix } = config;
  console.log(`app serve running on http://${host}:${port}/${globalPrefix}`);
  console.log(`接口文档  http://${host}:${port}/${swaggerPath}`);
  console.log(`swagger json  http://${host}:${port}/swagger/json`);
});
